Andy:
日安:
slice
。length
屬性,指的是參數數量( 只有Object沒有 )。Henry:
turtle:
kai:
Tony:
Jason:
Chris:
argument
是 ES6 不支援的 arrayLikevar str2 = str.split("").reverse().join("")
是醜做法number | 0
可以變 32 bitTomas
Jimmy:
mango:
會出現 array-like 的情況
- Various DOM query operations return lists of DOM elements that are not true array.
各種 DOM 查詢操作返回的 lists 不是真的 array,而是array-likes。
- when functions expose the arguments (array-like) object (as of ES6, deprecated) to access the arguments as a list.
例如接 API 時要回傳我們function()
使用了什麼參數,會傳去一個類陣列包住使用參數(書本叫引數,arguments)類陣列不像陣列可以繼承陣列所有方法使用,通常會用變成 array 操作
類陣列不像陣列可以繼承陣列所有方法使用,通常會用變成 array 操作
JavaScript 裡的 string 不是以 Character 字元存在 array 裡
value-copy vs by reference-copy
Jason 的舉例:
let a = [1,2,3];
Array.prototype.splice.call(a, 0, 1);
let a = [1,2,3];
a.splice(0, 1);
這兩個的效果是一樣的,因為 splice()
這個 method 在 prototype 內,所以一個新的 array 物件,會繼承 prototype 內的 method ,因此可以直接拿來用。
function foo (){
var arr = Array.prototype.slice.call (arguments);
arr.push("bam");
console.log(arr);
}
foo("bar","baz"); //["bar","baz","bam"]
var arr = Array.from(arguments);
var arr = [...arguments];
Array 可以用靜態方法 Array.from
呼叫,而僅有Array
可以呼叫 prototype 的 method。
length
特性。JavaScript 中的整數其實就是沒有小數點十進位值的一個值。
JavaScript 預設語法中都會以基數10的十進位形式輸出,其後尾隨隨小數部分的那些0會被移除。
使用的是 IEEE754 標準中的雙精度格式(64位元的二進位數字),採用逼近數字的方法運算。
非常大或是非常小的值會以指數形式輸出。
數字能夠取用內建於 Number.prototype 中的方法,例如:toFixed、toPrecision。toFixed 回傳字串。
可以直接用 number 字面值取用它,但必須注意點運算子。
number 也可以指數指定較大數字。
數字也可以二進位或八進位以及十六進位前綴來有效表示。parseInt
轉的最大進制為 36 進制。
數字的預訂值
最大值及安全值可以以 toString
方法測長度,轉二進制位元,可以知道位元差距。
let a = 0.2;
let b = 0.1;
function getPrecision(num) {
const numStr = num.toString();
return /\./.test(numStr)
? numStr.split('.')[1].length
: 0;
}
function splitWithDot(x, y) {
const precisionX = getPrecision(x);
const precisionY = getPrecision(y);
if (precisionX === 0 && precisionY === 0) return x + y;
const powNum = Math.pow(10, Math.max(precisionX, precisionY));
const powX = x * powNum;
const powY = y * powNum;
return (powX + powY) / powNum;
}
const answer = splitWithDot(a, b);
console.log(answer);
toFixed 為銀行進位法,不算是四捨五入。
function foo(){
undefined = 2;
//非常不建議這樣做
}
foo();//undefined
function foo(){
'use strict'
undefined = 2;
//非常不建議這樣做
}
foo();//Error
undefined 是一個內建的識別字,持有內建的 undefined 值,可以透過 void 運算子取得。
void 運算子會讓任何值變得空無,他不會修改現在的值,能確保的值這個運算式不會回傳任何值。
var a = 42;
console.log(void a, a)// undefined 42
當你要確保一個運算式沒有值,就可以使用 void:
function doSomething(){
if(!APP.ready){
//稍後再試一次
return void setTimeout (doSomething, 100);
//讓 setTimeout 永遠不會有回傳值
}
var result;
//做其他事
return result;
}
if(doSomething()){
// 立即處理下件事
}
var a = false;
function doSomething() {
console.log('// note: `APP.ready` is provided by our application')
if (!a) {
console.log('// try again later')
return void setTimeout( doSomething, 100 );
// setTimeout 的回傳值不會被攔截
}
var result = true;
console.log('// do some other stuff');
return result;
}
console.log('// were we able to do it right away?');
if (doSomething()) {
console.log('// handle next tasks right away');
}
NaN !== NaN
。isNaN()
,不過此方法太過NaN了,使他的工作基本上變成「測試看看傳入的東西是不是一個number」Number.isNaN()
。在 ES6 有一個新工具可以測試兩個值是否絕對相等,他叫做 Object.is(..)
:
var a = 2 / "foo";
var b = -3 * 0;
Object.is(a, NaN);//true
Object.is(b, -0);//true
Object.is(b, 0); //false
Object.assign
,皆為淺拷貝。Array.from
為淺拷貝,可以轉陣列,但二維陣列就會指向到舊的陣列。//Henry
const c = [1,2,[3,4, [5,6]], 'abc'];
function recursion (x) {
if(typeof(x) === 'number') {
return Number(x);
} else if (typeof(x) === 'string') {
return String(x);
} else if (Array.isArray(x)) {
let arr = [];
x.forEach(current => {
arr.push(recursion(current));
});
return arr;
}
}
const d = recursion(c);
d[2][2][0] =989; // 原本的 c 不會被修改到
const e = c;
e[2][2][0] =234; // 原本的 c 會被修改到
//kai
var a = [1, 2, 3, [4, 5]];
var b = Array.from(a);
b[0] = 4;
a // [1, 2, 3, [4, 5]]
b // [4, 2, 3, [4, 5]]
b[3][0] = 10;
a // [1, 2, 3, [10, 5]]
b // [1, 2, 3, [10, 5]]
function deepCopy(val){
const obj = {...val};
for(item in obj){
if(typeof(obj[item]) === "object"){
obj[item] = deepCope({...obj[item]})
}else{
obj[item] = val[item];
}
}
return obj;
}
//json
const arr = [["23er", 2, 3], [4, [1, 2, 3], 6], [7, 8, 9]];
function copyArray(x) {
if (typeof (x) !== "object") return x; //進來的只有object和array
else if (Array.isArray(x)) {
let newArr = [];
for (let i = 0; i < x.length; i++) {
newArr[i] = copyArray(x[i]);
}
return newArr;
}
else {
console.log('is object');
//還沒想物件的deep copy
}
}
let nArr = copyArray(arr);
nArr[1][1][0] = 2;
console.log(arr);
console.log(nArr);
// tomas
const arr = [
1,
2,
3,
[4, 5, 6,
[7]
]
];
const checkHasMoreArray = (arr) =>
Array.isArray(arr) &&
arr.some(item => Array.isArray(item));
const deepCopy = ([head, ...arr]) => {
const hasMoreArray = checkHasMoreArray(head);
const result = hasMoreArray
? deepCopy(head)
: [head];
const otherResult = arr.length === 0
? []
: deepCopy(arr);
return [head, ...otherResult]
};
console.log(deepCopy(arr));
由於本週第五章討論時程約四個小時左右,表決結果讀書會在鐵人賽結束前協議暫定一週討論一章節,鐵人賽結束再商議是否改為一週兩次。